home *** CD-ROM | disk | FTP | other *** search
- {
- Here is the code I use, adapted from the Intel Pentium Processor User's
- Manual, Chapter 5. It sets the Test8086 global variable, making the values
- of Test8086:
-
-
- 0 = 8086
- 1 = 80186/80286
- 2 = 80386
- 3 = 80386 (new)
- 4 = 80486 (new)
- 5 = Pentium (new)
- 6 = ??
-
-
- Note that for Pentium and higher CPUs, the new CPUID instruction is used to
- retrieve the processor family number. This code should work on post-Pentium
- (80686-class) CPUs and Pentium compatibles, and could return numbers > 5.
- }
-
- program CPUTest;
- {$IFDEF WINDOWS}
- uses wincrt;
- {$ELSE}
- uses crt;
- {$ENDIF}
-
- begin
- if (Test8086 = 2) then { RTL check stops at 2 = 386}
- asm
- inc Test8086 { 3 = 386, for consistency }
- { Do we have a 386 or a 486? }
- { Does pushf/popf preserve the Alignment Check bit? (386=no, 486=yes) }
- mov bx, sp { save current stack pointer }
- and sp, not 3 { align stack to avoid AC fault }
- db $66; pushf
- db $66; pop ax
- db $66; mov cx, ax
- db $66, $35; dd $40000 { xor AC bit in EFLAGS }
- db $66; push ax
- db $66; popf
- db $66; pushf
- db $66; pop ax
- db $66; xor ax, cx { Is AC bit toggled? }
- je @@1 { if not, we have a 386 }
- and sp, not 3 { align stack to avoid AC fault }
- db $66; push cx
- db $66; popf { restore original AC bit }
- mov sp, bx { restore original stack pointer }
- mov Test8086, 4 { we know we have at least a 486 }
-
- { Do we have a 486 or a Pentium? }
- { Does pushf/popf preserve the CPUID bit? (486=no, P5=yes) }
- db $66; mov ax, cx { get original EFLAGS}
- db $66, $35; dd $200000 { XOR id bit in flags}
- db $66; push ax
- db $66; popf
- db $66; pushf
- db $66; pop ax
- db $66; xor ax, cx { Is CPUID bit toggled? }
- je @@1 { if not, we have a 486 }
- db $66; xor ax, ax
- db $f,$a2 { CPUID, AX = 0 (get CPUID caps) }
- db $66; cmp ax, 1
- jl @@1 { if < 1, then exit }
- db $66; xor ax, ax
- db $66; inc ax
- db $f,$a2 { CPUID, AX = 1 (get CPU info) }
- and ax, $f00 { mask out all but family id }
- shr ax, 8
- mov Test8086, al { Pentium family = 5 }
- @@1:
- end;
-
- writeln('Test8086: ',Test8086);
- end.
-